package com.ittao.taoaicodemother.ai.tools;

import cn.hutool.json.JSONObject;
import com.ittao.taoaicodemother.manage.storage.strategy.FileStorageStrategy;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import org.springframework.core.io.Resource;

/**
 * 文件读取工具
 * 支持 AI 通过工具调用的方式读取文件内容
 */
@Slf4j
@Component
public class FileReadTool extends BaseTool {

    @Tool("读取指定路径的文件内容")
    public String readFile(
            @P("文件的相对路径")
            String relativeFilePath,
            @ToolMemoryId Long appId
    ) {
        if (relativeFilePath == null || relativeFilePath.trim().isEmpty()) {
            return "错误：文件路径不能为空";
        }

        try {
            // 使用基类的统一路径构建方法
            String fullFilePath = buildFullFilePath(appId, relativeFilePath);

            // 使用策略模式获取当前存储策略
            FileStorageStrategy storageStrategy = getCurrentStorageStrategy();

            // 直接尝试读取文件，文件不存在会在readFile方法中抛出异常
            try {
                Resource resource = storageStrategy.readFile(fullFilePath);
                return new String(resource.getInputStream().readAllBytes());
            } catch (Exception readException) {
                return "错误：文件不存在或读取失败 - " + relativeFilePath + ", 错误: " + readException.getMessage();
            }

        } catch (Exception e) {
            String errorMessage = "读取文件失败: " + relativeFilePath + ", 错误: " + e.getMessage();
            log.error(errorMessage, e);
            return errorMessage;
        }
    }

    @Override
    public String getToolName() {
        return "readFile";
    }

    @Override
    public String getDisplayName() {
        return "文件读取工具";
    }

    @Override
    public String generateToolExecutedResult(JSONObject arguments) {
        String relativeFilePath = arguments.getStr("relativeFilePath");
        // 生成简洁的工具执行结果
        String result = String.format("""
                **📖 [工具调用]** %s %s
                """, getDisplayName(), relativeFilePath);

        // 输出前端和要持久化的内容
        return String.format("\n\n%s\n\n", result);
    }
}